package com.damie.utils;

import org.apache.rocketmq.client.exception.MQBrokerException;
import org.apache.rocketmq.client.exception.MQClientException;
import org.apache.rocketmq.client.producer.DefaultMQProducer;
import org.apache.rocketmq.client.producer.SendResult;
import org.apache.rocketmq.common.message.Message;
import org.apache.rocketmq.remoting.exception.RemotingException;

import java.util.UUID;


public class RocketUtils {


    public static void msg(String msg) throws MQClientException, RemotingException, InterruptedException, MQBrokerException {
        /*
        group 相同的生产者成为一个生产者组

        标识发送同一类消息的Producer，通常发送逻辑一致。
        发送普通消息的时候，仅标识使用，并无特别用处。

        若发送事务消息，发送某条消息的producer-A宕机，
        使得事务消息一直处于PREPARED状态并超时，
        则broker会回查同一个group的其他producer，
        确认这条消息应该commit还是rollback。

        但开源版本并不完全支持事务消息（阉割了事务回查的代码）。
         */
        System.out.println("===================================================");
        //生产者组  防止生产者死掉 可以向其他生产者反馈
        DefaultMQProducer producer = new DefaultMQProducer(UUID.randomUUID().toString());
        //若是多太服务器，则用分号隔开写多个地址，从源码中可以得知
        producer.setNamesrvAddr("192.168.60.59:9876");
        //启动生产者
        producer.start();

        //主题相当于是消息的分类, 一类消息使用一个主题
        String  topic = "damie";

        // tag 相当于是消息的二级分类, 在一个主题下, 可以通过 tag 再对消息进行分类
        String  tag = "123";
            Message message = new Message(topic, tag, msg.getBytes());
            // 发送消息后会得到服务器反馈, 包含: smsgId, sendStatus, queue, queueOffset, offsetMsgId
            SendResult result = producer.send(message);
            System.out.println("反馈结果："+result);
    }

}
